home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 51 / Amiga Format CD51 (2000-03-10)(Future Publishing)(GB)[!][issue 2000-04].iso / -in_the_mag- / pdselect / blizkick / modules / localfast.asm < prev    next >
Assembly Source File  |  2000-02-16  |  6KB  |  272 lines

  1. ; FILE: Source:modules/LocalFast.ASM          REV: 2 --- LocalFast module
  2.  
  3. ;
  4. ; LocalFast module for BlizKick 1.20+
  5. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  6. ; Written by Harry "Piru" Sintonen.
  7. ; This source code is Public Domain.
  8. ;
  9. ; As I decided to drop LOCALFAST feature from BlizKick 1.20
  10. ; and after getting some requests about getting this feature
  11. ; back (hi Hexaae;), I decided to code it as a external
  12. ; module.
  13. ;
  14. ; Imlementation note: this module WILL be confused by PoolMem.
  15. ; Doesn't crash, but will refuse to install.
  16. ;
  17. ;    - Piru
  18. ;
  19.  
  20.     incdir    "include:"
  21.     include    "exec/types.i"
  22.     include    "exec/memory.i"
  23.     include    "exec/execbase.i"
  24.  
  25.     include    "blizkickmodule.i"
  26.  
  27. ; PoolMem uses this to indicate small pool MemHeader.
  28.     BITDEF    MEM,POOLMEM,4
  29.  
  30.  
  31.     SECTION    PATCH,CODE
  32. _DUMMY_LABEL
  33.     BK_PTC
  34.  
  35. ; Code is run with following incoming parameters:
  36. ;
  37. ; a0=ptr to ROM start (buffer)    eg. $1DE087B8
  38. ; a1=ptr to ROM start (ROM)    eg. $00F80000 (do *not* access!)
  39. ; d0=ROM lenght in bytes    eg. $00080000
  40. ; a2=ptr to _FindResident routine (will search ROM buffer for resident tag):
  41. ;    CALL: jsr (a2)
  42. ;      IN: a0=ptr to ROM, d0=rom len, a1=ptr to resident name
  43. ;     OUT: d0=ptr to resident (buf) or NULL
  44. ; a3=ptr to _InstallModule routine (can be used to plant a "module"):
  45. ;    CALL: jsr (a3)
  46. ;      IN: a0=ptr to ROM, d0=rom len, a1=ptr to module, d6=dosbase
  47. ;     OUT: d0=success
  48. ; a4=ptr to _Printf routine (will dump some silly things (errormsg?) to stdout ;-)
  49. ;    CALL: jsr (a4)
  50. ;      IN: a0=FmtString, a1=Array (may be 0), d6=dosbase
  51. ;     OUT: -
  52. ; d6=dosbase, a6=execbase
  53. ;
  54. ; Code should return:
  55. ;
  56. ; d0=true if succeeded, false if failed.
  57. ; d1-d7/a0-a6 can be trashed. a7 *must* be preserved! ;-)
  58.  
  59.     moveq    #0,d7
  60.  
  61.     cmp.w    #37,($C,a0)        ;requires V37+ rom image
  62.     blo    .exit
  63.  
  64.     lea    (regs,pc),a5
  65.     movem.l    d0/a0-a4,(a5)
  66.  
  67.     ; find the blizzard memory header
  68.  
  69.     jsr    (-$84,a6)        ; Forbid
  70.     lea    (MemList,a6),a5
  71.     lea    (LH_TAIL,a5),a4        ; end marker
  72. .scanloop    move.l    (a5),a5
  73.     cmp.l    a5,a4            ; list end reached?
  74.     beq    .nomem
  75.  
  76.     move.w    (MH_ATTRIBUTES,a5),d0
  77.  
  78.     ; this is a 1st PoolMem check...
  79.     btst    #MEMB_POOLMEM,d0
  80.     bne    .poolmem
  81.  
  82.     ; Find public fast, that has no MEMF_POOLMEM, MEMF_CHIP,
  83.     ; MEMF_KICK or MEMF_LOCAL set:
  84.     and.w    #MEMF_POOLMEM!MEMF_CHIP!MEMF_FAST!MEMF_PUBLIC!MEMF_KICK!MEMF_LOCAL,d0
  85.     cmp.w    #MEMF_FAST!MEMF_PUBLIC,d0
  86.     bne.b    .scanloop
  87.  
  88.     cmp.l    #$01000000,(MH_LOWER,a5) ; must be 32bit mem
  89.     blo.b    .scanloop
  90.  
  91.     move.l    (LN_NAME,a5),d0        ; some logic to check node name
  92.     beq.b    .found
  93.     move.l    d0,a2
  94.     move.l    (a2),d0
  95.     or.l    #$20202020,d0        ; To lowercase
  96.     cmp.l    #'bliz',d0
  97.     beq.b    .found
  98.     tst.b    (a2)            ; null name -> buggy AllocMem result test!
  99.     bne.b    .scanloop
  100. .found
  101.     move.l    #$07FFFF,d0        ; this is a 2nd PoolMem check...
  102.     and.l    (MH_UPPER,a5),d0
  103.     bne    .poolmem
  104.  
  105.     move.l    (MH_LOWER,a5),d0
  106.     move.l    (MH_UPPER,a5),d1
  107.     clr.w    d0
  108.     lea    (aml_regs,pc),a0
  109.     sub.l    d0,d1
  110.     move.l    d1,(a0)+        ; size
  111.  
  112.     move.w    (MH_ATTRIBUTES,a5),d1
  113.     and.l    #MEMF_PUBLIC!MEMF_FAST!MEMF_LOCAL!MEMF_24BITDMA,d1
  114.     move.l    d1,(a0)+        ; attrs
  115.  
  116.     move.b    (LN_PRI,a5),d1
  117.     extb.l    d1            ; sign extend b -> l
  118.     move.l    d1,(a0)+        ; pri
  119.  
  120.     move.l    d0,(a0)+        ; base
  121.  
  122.     move.l    (LN_NAME,a5),d0
  123.     beq.b    .lmpfixname
  124.     move.l    d0,a1
  125.     tst.b    (a1)
  126.     bne.b    .lmphasname
  127. .lmpfixname
  128.     lea    (.fixedname,pc),a1
  129. .lmphasname
  130.     addq.l    #4,a0
  131.     move.l    a0,(-4,a0)        ; name
  132.     moveq    #32-2,d0
  133. .lmpcopy    move.b    (a1)+,(a0)+
  134.     dbeq    d0,.lmpcopy
  135.     beq.b    .lmpnoname
  136.     clr.b    (a0)+
  137. .lmpnoname
  138.     jsr    (-$8a,a6)        ; Permit
  139.  
  140.     ; find exec.library resident tag
  141.  
  142.     lea    (.execname,pc),a1
  143.     movem.l    (regs,pc),d0/a0
  144.     move.l    (findresident,pc),a2
  145.     jsr    (a2)
  146.     tst.l    d0
  147.     beq    .exit
  148.  
  149.     move.l    d0,a3
  150.     move.l    (RT_INIT,a3),d1
  151.  
  152.     ;test if inside rom bounds?
  153.     move.l    (rom_log,pc),d0
  154.     cmp.l    d0,d1
  155.     blo.b    .nofix
  156.     add.l    (rom_size,pc),d0
  157.     cmp.l    d0,d1
  158.     bhs.b    .nofix
  159.     ; inside rom, so generate ram buffer address
  160.     sub.l    (rom_log,pc),d1        ; -$f80000
  161.     add.l    (rom_phys,pc),d1    ; +buffer
  162. .nofix
  163.     ; d1 = RT_INIT address
  164.     ; fix our code to jump here when done
  165.  
  166.     lea    (jumpaddr,pc),a1
  167.     move.l    d1,(a1)
  168.  
  169.     ; install patch code...
  170.  
  171.     lea    (_localfast_module,pc),a1
  172.     movem.l    (regs,pc),d0/a0
  173.     move.l    (installmodule,pc),a2
  174.     jsr    (a2)
  175.     tst.l    d0
  176.     beq.b    .exit
  177.  
  178.     ; find ourself
  179.  
  180.     lea    (_name,pc),a1
  181.     movem.l    (regs,pc),d0/a0
  182.     move.l    (findresident,pc),a2
  183.     jsr    (a2)
  184.     tst.l    d0
  185.     beq.b    .exit
  186.  
  187.     ; fix RT_INIT to jump our patch code
  188.  
  189.     add.l    #_earlycode_RT,d0
  190.     move.l    d0,(RT_INIT,a3)
  191.  
  192.     ; all done, return success
  193.  
  194.     moveq    #1,d7
  195. .exit
  196.     move.l    d7,d0
  197.     rts
  198.  
  199. .nomem    lea    (.nomemerr,pc),a0
  200.  
  201. .perr    jsr    (-$8a,a6)        ; Permit
  202.     move.l    (printf,pc),a2
  203.     jsr    (a2)
  204.     bra.b    .exit
  205.  
  206. .poolmem    lea    (.poolmemerr,pc),a0
  207.     bra.b    .perr
  208.  
  209. .execname    dc.b    'exec.library',0
  210. .nomemerr    dc.b    'LocalFast: valid memory header could not be found!',10,0
  211. .poolmemerr    dc.b    'LocalFast: PoolMem has messed up Memory headers!',10,0
  212. .fixedname    dc.b    'Blizzard_Mem',0
  213.  
  214.  
  215.     CNOP    0,2
  216. _localfast_module
  217.  BK_MOD BKMF_SingleMode,_end,(0)<<24+37<<16+NT_UNKNOWN<<8+(256-128),_name,_idstr,_init
  218.  
  219. ; Singlemode on,
  220. ; NEVER INIT module, requires KS V37.x or better, module type NT_UNKNOWN, priority -128.
  221.  
  222. _init    rts
  223.  
  224. _earlycode_RT    EQU    *-_localfast_module-bkm_ResTag
  225.  
  226.     ; a6=execbase
  227.     movem.l    d0-d2/a0-a1,-(sp)
  228.  
  229.     ; is this memory already present?
  230.     move.l    (aml_base,pc),a1
  231.     lea    (256,a1),a1        ; skip possible MH
  232.     jsr    (-$216,a6)        ; TypeOfMem
  233.     tst.l    d0
  234.     bne.b    .already        ; it is, skip!
  235.  
  236.     ; add the memory!
  237.     movem.l    (aml_regs,pc),d0-d2/a0-a1
  238.     jsr    (-$26a,a6)        ; AddMemList
  239. .already
  240.     movem.l    (sp)+,d0-d2/a0-a1
  241.     dc.w    $4ef9
  242. jumpaddr    dc.l    $badc0de
  243.  
  244. aml_regs    dc.l    0            ; d0 size
  245.     dc.l    0            ; d1 attrs
  246.     dc.l    0            ; d2 pri
  247. aml_base    dc.l    0            ; a0 base
  248.     dc.l    0            ; a1 name
  249.     ds.b    32            ; space for memory name
  250.  
  251. _name
  252. _idstr    dc.b    'LocalFast.patch',0
  253.     CNOP    0,2
  254. _end
  255.  
  256.  
  257.     CNOP    0,2
  258. regs
  259. rom_size    ds.l    1
  260. rom_phys    ds.l    1
  261. rom_log    ds.l    1
  262. findresident    ds.l    1
  263. installmodule    ds.l    1
  264. printf    ds.l    1
  265.  
  266.  
  267.  
  268.     SECTION    VERSION,DATA
  269.  
  270.     dc.b    '$VER: LocalFast_PATCH 1.1 (29.1.00)',0
  271.  
  272.